parser grammar CParser2;

options {
  language = Java;
  tokenVocab = CLexer2;
  backtrack=true;
  memoize=true;
}

@header {
   package ejercicio3; 
}

programa: VOID MAIN PAR_OP VOID PAR_CL LLAV_OP codigo LLAV_CL EOF;
codigo: sentencia+;
declaracion: INT IDENT (COMA IDENT)*;
sentencia: (funcion SEPARADOR | declaracion SEPARADOR| exp_while | exp_if | asignacion SEPARADOR | BREAK SEPARADOR);
funcion: IDENT PAR_OP param PAR_CL;
param: (exp+ (COMA exp)*)*;
asignacion: IDENT OP_IGUAL exp; 
exp_while: WHILE PAR_OP exp PAR_CL cuerpo; 
exp_if: IF PAR_OP exp PAR_CL cuerpo; 
cuerpo: sentencia | (LLAV_OP sentencia+ LLAV_CL);
exp: exp_mult (OP_ADD exp_mult)* ;
exp_mult : exp_base (OP_MUL exp_base)* ;
exp_base : exp_sub (OP_REL exp_sub)*; 
exp_sub: NUMERO | PAR_OP exp PAR_CL | IDENT | CADENA; 